// energyManager.js - 体力管理系统（带自动恢复）
export default class EnergyManager {
  constructor() {
    this.maxEnergy = 10; // 最大体力值
    this.energyRecoveryInterval = 60 * 60 * 1000; // 恢复间隔：1小时（毫秒）
    this.energyKey = 'puzzleEnergyData'; // 存储键名
    this.loadEnergyData();
  }

  // 加载体力数据并计算自动恢复
  loadEnergyData() {
    try {
      const data = wx.getStorageSync(this.energyKey);
      const now = Date.now();
      
      if (data) {
        this.currentEnergy = data.currentEnergy;
        this.lastUpdateTime = data.lastUpdateTime;
        
        // 计算自动恢复的体力
        this.calculateAutoRecovery(now);
      } else {
        // 初始化数据
        this.currentEnergy = this.maxEnergy;
        this.lastUpdateTime = now;
        this.saveEnergyData();
      }
      
      console.log('加载体力数据，当前体力:', this.currentEnergy);
    } catch (error) {
      console.error('加载体力数据失败:', error);
      // 使用默认值
      this.currentEnergy = this.maxEnergy;
      this.lastUpdateTime = Date.now();
    }
  }

  // 计算自动恢复的体力
  calculateAutoRecovery(currentTime) {
    if (this.currentEnergy >= this.maxEnergy) {
      // 体力已满，不需要恢复
      this.lastUpdateTime = currentTime;
      this.saveEnergyData();
      return;
    }
    
    // 计算经过的时间（毫秒）
    const elapsedTime = currentTime - this.lastUpdateTime;
    
    // 计算应该恢复的体力点数
    const energyToRecover = Math.floor(elapsedTime / this.energyRecoveryInterval);
    
    if (energyToRecover > 0) {
      // 恢复体力
      this.currentEnergy = Math.min(this.currentEnergy + energyToRecover, this.maxEnergy);
      
      // 更新最后恢复时间（使用最后一次完整恢复的时间点）
      this.lastUpdateTime += energyToRecover * this.energyRecoveryInterval;
      
      console.log(`自动恢复 ${energyToRecover} 点体力，当前: ${this.currentEnergy}`);
      this.saveEnergyData();
    }
  }

  // 获取距离下次恢复的剩余时间（秒）
  getTimeToNextRecovery() {
    if (this.currentEnergy >= this.maxEnergy) {
      return 0; // 体力已满，无需恢复
    }
    
    const now = Date.now();
    const elapsedSinceLastRecovery = now - this.lastUpdateTime;
    const timeToNextRecovery = this.energyRecoveryInterval - elapsedSinceLastRecovery;
    
    return Math.max(0, Math.floor(timeToNextRecovery / 1000)); // 返回秒数
  }

  // 获取体力恢复进度（0-1）
  getRecoveryProgress() {
    if (this.currentEnergy >= this.maxEnergy) {
      return 1; // 体力已满
    }
    
    const timeToNext = this.getTimeToNextRecovery();
    return 1 - (timeToNext / (this.energyRecoveryInterval / 1000));
  }

  // 格式化恢复时间显示
  formatRecoveryTime(seconds) {
    if (seconds <= 0) return '00:00';
    
    const hours = Math.floor(seconds / 3600);
    const minutes = Math.floor((seconds % 3600) / 60);
    const secs = seconds % 60;
    
    if (hours > 0) {
      return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
    } else {
      return `${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
    }
  }

  // 保存体力数据
  saveEnergyData() {
    try {
      wx.setStorageSync(this.energyKey, {
        currentEnergy: this.currentEnergy,
        lastUpdateTime: this.lastUpdateTime
      });
    } catch (error) {
      console.error('保存体力数据失败:', error);
    }
  }

  // 检查是否有足够体力开始游戏
  canStartGame() {
    // 每次检查时都先计算自动恢复
    this.calculateAutoRecovery(Date.now());
    return this.currentEnergy > 0;
  }

  // 开始游戏消耗体力
  consumeEnergy() {
    // 先计算自动恢复
    this.calculateAutoRecovery(Date.now());
    
    if (this.currentEnergy > 0) {
      this.currentEnergy--;
      this.lastUpdateTime = Date.now(); // 更新最后操作时间
      this.saveEnergyData();
      console.log('消耗体力，剩余:', this.currentEnergy);
      return true;
    }
    return false;
  }

  // 通过广告增加体力
  addEnergyFromAd(amount = 3) {
    // 先计算自动恢复
    this.calculateAutoRecovery(Date.now());
    
    this.currentEnergy = Math.min(this.currentEnergy + amount, this.maxEnergy);
    this.lastUpdateTime = Date.now();
    this.saveEnergyData();
    console.log('广告获得体力，当前:', this.currentEnergy);
    return this.currentEnergy;
  }

  // 获取当前体力
  getCurrentEnergy() {
    // 先计算自动恢复
    this.calculateAutoRecovery(Date.now());
    return this.currentEnergy;
  }

  // 获取体力百分比（用于进度条）
  getEnergyPercent() {
    return this.getCurrentEnergy() / this.maxEnergy;
  }
}